package paint2.ui.ventanas;

import java.awt.BorderLayout;
import java.util.List;
import java.util.Set;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuBar;
import paint2.modelo.Figura;
import paint2.ui.ElementoVisible;
import paint2.ui.Menu;
import paint2.ui.SuperficiePintable;
import paint2.ui.ToolBar;

public class VentanaPrincipal implements Ventana {

    private JFrame ventanaPrincipal;
    private JMenuBar barraDeMenus;
    private SuperficiePintable superficie;
    private JLabel barraDeEstado = new JLabel("ninguna figura seleccionada");

    public VentanaPrincipal() {
        this.ventanaPrincipal = null;
        this.barraDeMenus = null;
    }

    public void crear() {
        this.crearVentanaPrincipal();
        this.actualizarContenido();
    }

    private void crearVentanaPrincipal() {
        if (laVentanaNoExiste()) {
            this.ventanaPrincipal = new JFrame();
            this.ventanaPrincipal.setTitle("miniPaint - Alvaro del Rosal");
            this.ventanaPrincipal.setSize(800, 600);
            this.ventanaPrincipal.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.ventanaPrincipal.getContentPane().setLayout(new BorderLayout());
            siExisteLaBarraDeMenusLaAgregaALaVentana();
        }
    }

    private boolean laVentanaNoExiste() {
        return ventanaPrincipal == null;
    }

    private void siExisteLaBarraDeMenusLaAgregaALaVentana() {
        if (existeLaBarraDeMenus()) {
            this.ventanaPrincipal.setJMenuBar(this.barraDeMenus);
        }
    }

    private boolean existeLaBarraDeMenus() {
        return barraDeMenus != null;
    }

    public void actualizarContenido() {
        this.ventanaPrincipal.setVisible(false);
        this.ventanaPrincipal.setVisible(true);
    }

    public void montarMenusDesde(List<ElementoVisible> menusDeLaVentana) {
        for (ElementoVisible menu : menusDeLaVentana) {
            this.agregar((Menu) menu);
        }
    }

    public void agregar(Menu elemento) {
        siNoExisteCreaLaBarraDeMenus();
        this.barraDeMenus.add(elemento.getMenu());
    }

    private void siLaVentanaNoExisteLaCrea() {
        if (laVentanaNoExiste()) {
            crear();
        }
    }

    private void siNoExisteCreaLaBarraDeMenus() {
        if (noExisteLaBarraDeMenus()) {
            creaLaBarraDeMenus();
        }
    }

    private boolean noExisteLaBarraDeMenus() {
        return this.barraDeMenus == null;
    }

    private void creaLaBarraDeMenus() {
        this.barraDeMenus = new JMenuBar();
    }

    public void montarToolBarDesde(List<ElementoVisible> elementos) {
        for (ElementoVisible elemento : elementos) {
            if (elemento != null) {
                this.agregar((ToolBar) elemento);
            }
        }
    }

    public void agregar(ToolBar toolBar) {
        siLaVentanaNoExisteLaCrea();
        ventanaPrincipal.getContentPane().add(toolBar.getToolBar(), BorderLayout.NORTH);
    }

    public void agregarSuperficiePintable() {
        siLaVentanaNoExisteLaCrea();
        this.superficie = new SuperficiePintable(this);
        ventanaPrincipal.getContentPane().add(this.superficie, BorderLayout.CENTER);
    }

    public void agregarStatusbar() {
        siLaVentanaNoExisteLaCrea();
        ventanaPrincipal.getContentPane().add(this.barraDeEstado, BorderLayout.SOUTH);
    }

    public void pintar(Figura figura) {
        this.superficie.pintarUna(figura);
    }

    public JFrame obtenerVentana() {
        return this.ventanaPrincipal;
    }

    public Set<Figura> obtenerFiguras() {
        return this.superficie.obtenerFiguras();
    }

    public SuperficiePintable obtenerSuperficiePintable() {
        return this.superficie;
    }

    public void cambiarElEstadoA(String estado) {
        this.barraDeEstado.setText(estado);
    }

}
